const querystring = require('querystring')
const {access} = require('./src/utils/log')
const handleBlogRouter = require('./src/router/blog')
const handleUserRouter = require('./src/router/user')
// 获取cookie的过期时间
const getCookieExpires = () => {
    const d=new Date()
    d.setTime(d.getTime() + 24*60*60*1000)
    return d.toGMTString()
}
const getPostData = (req) => {
    const promise = new Promise((resolve, reject) => {

        if(req.method !== 'POST') {
            resolve({})
            return
        }
        if(req.headers['content-type'] !== 'application/json'){
            resolve({})
            return
        }
        let postData = ''
        
        // 接收数据
        req.on('data', chunk => {
            console.log('chunk', chunk.toString())
            postData += chunk.toString()
        })

        // 返回结果
        req.on('end', () => {
            if(!postData) {
                resolve({})
                return
            }
            resolve(JSON.parse(postData))
        })
    })
    return promise
}

const serverHandle = (req, res) => {
    // 日志处理
    access(`${req.method} -- ${req.url} -- ${req.headers['user-agent']} -- ${Date.now()}`)

    res.setHeader('Content-type', 'application/json')

    // 获取path
    const url = req.url
    req.path= url.split('?')[0]

    // 解析 query
    req.query = querystring.parse(url.split('?')[1])
    
    // 解析cookie
    req.cookie = {}
    let SESSION_DATA={}
    const cookieStr = req.headers.cookie || ''
    cookieStr.split(';').forEach(item => {
        if(!item){
            return 
        }
        const arr = item.split('=')
        const key=arr[0].trim()
        const value=arr[1].trim()
        req.cookie[key] = value
    })

    // 解析session
    let needSetCookie = false
    let userId=req.cookie.userId;
    if(userId){
        if(!SESSION_DATA[userId]){
            SESSION_DATA[userId] = {}
        }
        req.session = SESSION_DATA[userId]
    } else {
        needSetCookie=true
        userId = `${Date.now()}_${Math.random()}`
        SESSION_DATA[userId] = {}
    }
    req.session = SESSION_DATA[userId]

    getPostData(req).then(postData => {
        req.body = postData

        // 处理blog路由
        const blogResult = handleBlogRouter(req, res)
        if(blogResult){
            blogResult.then(blogData => {
                if(needSetCookie) {
                    res.setHeader('Set-Cookie', `userid=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`)
                }
                res.end(
                    JSON.stringify(blogData)
                )
            })
            return
        }
    
        // 处理user路由
        const userResult = handleUserRouter(req, res)
        if(userResult){
            userResult.then(userData => {
                if(needSetCookie) {
                    res.setHeader('Set-Cookie', `userid=${userId}; path=/; httpOnly; expires=${getCookieExpires()}`)
                }
                res.end(
                    JSON.stringify(userData)
                )
            })
            return
        }

        // 未命中路由 返回404
        res.writeHead(404, {"Content-type": "text/plain"})
        res.write("404 Not Found\n")
        
        // 服务响应结束
        res.end()
    })
    
    
}
module.exports = serverHandle